/**
 * @addtogroup srt_storage_interface
 * srt_storage_interface
 * @{
 */
/**
 * @file         srt_storage_interface.h
 * @brief        属性存储的接口
 * @note    
 * @author       Akee(shengkun.you@hopechart.com,尤胜坤)
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author                                    <th>Description
 * <tr><td>2022-12-07  <td>1.0                   <td>Akee(shengkun.you@hopechart.com,尤胜坤)   <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _SRT_STORAGE_INTERFACE_H_
#define _SRT_STORAGE_INTERFACE_H_
#include "ofc/ofc_types.h"
#include "srt_storage/srt_common_def.h"
#ifdef __cplusplus
extern "C" {
#endif


typedef struct TSrtStorageParamTag TSrtStorageParam;
struct TSrtStorageParamTag
{
    TSrtKeyIdDesc id;
    Word max_len;           ///< 最大长度，主要针对Mem类型的存储分布是变长的
    Word data_len;          ///< 实际长度
    UInt8 *data;            ///< 数据
};

typedef struct ISrtStorageTag ISrtStorage;

/**
 * 写入存储的属性
 * @param sender: 对象指针
 * @param param: 写的参数
 * @return >=0: 写入的长度; <0: 错误码，@ref 参考THccMidSrtStorageErrorCodeEnum
 */
typedef Int32 (*ISrtStorageWriteCallback)(ISrtStorage *sender, const TSrtStorageParam *param);

/**
 * 读取存储的属性
 * @param sender: 对象指针
 * @param id: 读取的id指
 * @param buf: 读取存放的buf缓冲
 * @param buf_size: buf缓冲大小
 * @return >=0: 读取的长度; <0: 错误码，@ref 参考THccMidSrtStorageErrorCodeEnum
 */
typedef Int32 (*ISrtStorageReadCallback)(ISrtStorage *sender, UInt32 id, UInt8 *buf, Int16 buf_size);

/**
 * 事务开始
 * @param sender: 对象指针
 * @return 
 */
typedef void (*ISrtStorageBeginTransactionCallback)(ISrtStorage *sender);

/**
 * 删除单项ID
 * @param sender: 对象指针
 * @param id: 删除的id指
 * @return @ref 参考THccMidSrtStorageErrorCodeEnum
 */
typedef Int32 (*ISrtStorageDeleteIdCallback)(ISrtStorage *sender, UInt32 id);

/**
 * 事务结束
 * @param sender: 对象指针
 * @return 
 */
typedef void (*ISrtStorageEndTransactionCallback)(ISrtStorage *sender);

/**
 * 格式化属性
 * @param sender: 对象指针
 * @return 
 */
typedef Int32 (*ISrtStorageFormatCallback)(ISrtStorage *sender);

/**
 * 属性存储接口集
 */
struct ISrtStorageTag
{
    ISrtStorageWriteCallback DoWrite;
    ISrtStorageReadCallback DoRead;
    ISrtStorageBeginTransactionCallback DoBeginTransaction;
    ISrtStorageDeleteIdCallback DoDeleteId;
    ISrtStorageEndTransactionCallback DoEndTransaction;
    ISrtStorageFormatCallback DoFormat;
};

/**
 * 构造函数
 * @param self: 对象指针
 * @return 
 */
void TSrtStorageCreate(ISrtStorage *self);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void TSrtStorageDestroy(ISrtStorage *self);

/**
 * 写入存储的属性
 * @param self: 对象指针
 * @param param: 写的参数
 * @return >=0: 写入的长度; <0: 错误码，@ref 参考THccMidSrtStorageErrorCodeEnum
 */
Int32 TSrtStorageWrite(ISrtStorage *self, const TSrtStorageParam *param);

/**
 * 读取存储的属性
 * @param self: 对象指针
 * @param id: 读取的id指
 * @param buf: 读取存放的buf缓冲
 * @param buf_size: buf缓冲大小
 * @return >=0: 读取的长度; <0: 错误码，@ref 参考THccMidSrtStorageErrorCodeEnum
 */
Int32 TSrtStorageRead(ISrtStorage *self, UInt32 id, UInt8 *buf, Int16 buf_size);

/**
 * 事务开始
 * @param self: 对象指针
 * @return 
 * @note 通过TSrtStorageWrite写数据前必须先调用，跟TSrtStorageEndTransaction配套
 */
void TSrtStorageBeginTransaction(ISrtStorage *self);

/**
 * 删除单项ID
 * @param self: 对象指针
 * @param id: 删除的id指
 * @return @ref 参考THccMidSrtStorageErrorCodeEnum
 */
Int32 TSrtStorageDeleteId(ISrtStorage *self, UInt32 id);

/**
 * 事务结束
 * @param self: 对象指针
 * @return 
 * @note 通过TSrtStorageWrite写数据和TSrtStorageFormat格式化后必须调用，跟TSrtStorageBeginTransaction配套
 */
void TSrtStorageEndTransaction(ISrtStorage *self);

/**
 * 格式化
 * @param self: 对象指针
 * @return 
 * @note @ref 参考THccMidSrtStorageErrorCodeEnum
 */
Int32 TSrtStorageFormat(ISrtStorage *self);


#ifdef __cplusplus
} // extern "C" {
#endif

#endif

/**
 * @} 
 */


